//package com.hmdp.service.impl;
//
//import cn.hutool.core.lang.UUID;
//import cn.hutool.core.util.RandomUtil;
//import com.hmdp.dto.Result;
//import com.hmdp.dto.UserDTO;
//import com.hmdp.entity.SeckillVoucher;
//import com.hmdp.entity.VoucherOrder;
//import com.hmdp.mapper.VoucherOrderMapper;
//import com.hmdp.service.ISeckillVoucherService;
//import com.hmdp.service.IVoucherOrderService;
//import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
//import com.hmdp.utils.UserHolder;
//import jdk.nashorn.internal.ir.RuntimeNode;
//import lombok.extern.slf4j.Slf4j;
//import org.redisson.api.RLock;
//import org.redisson.api.RedissonClient;
//import org.springframework.aop.framework.AopContext;
//import org.springframework.stereotype.Service;
//import org.springframework.transaction.annotation.Transactional;
//
//import javax.annotation.Resource;
//import javax.servlet.http.HttpSession;
//import javax.xml.ws.Holder;
//import java.time.LocalDateTime;
//
///**
// * <p>
// *  服务实现类
// * </p>
// *
// * @author 虎哥
// * @since 2021-12-22
// */
//@Slf4j
//@Service
//public class VoucherOrderServiceImpl extends ServiceImpl<VoucherOrderMapper, VoucherOrder> implements IVoucherOrderService {
//@Resource
//private ISeckillVoucherService  iSeckillVoucherService;
//@Resource
//private RedissonClient redissonClient;
//    @Override
//    public Result seckillVoucher(Long voucherId) {
//        //1.查询优惠卷
//        SeckillVoucher s = iSeckillVoucherService.getById(voucherId);
//        //2.判断秒杀是否开始
//        if (s.getBeginTime().isAfter(LocalDateTime.now())) {
//            return Result.fail("秒杀尚未开始");
//        }
//        //3.判断秒杀是否结束
//        if (s.getEndTime().isBefore(LocalDateTime.now())) {
//            return Result.fail("秒杀已经结束");
//        }
//        //4.判断库存是否充足
//        if (s.getStock() <= 0) {
//            return Result.fail("库存不足");
//        }
//        //添加订单：
//        Long userId = UserHolder.getUser().getId();
//        //因为分布式下，不同JVM 锁的获取和释放完全由本地 JVM 管理，而redis就可以被不同的JVM访问
//        synchronized (userId.toString().intern()) {
//            //事务失效，获取IVoucherOrderService的代理对象，才能调用addOder这个方法，更重要的是 事务才能生效
//            IVoucherOrderService p = (IVoucherOrderService)AopContext.currentProxy();
//            return p.addOder(voucherId);
//        }
//}
//
//
//    /**
//     *  方式2   Redission 加锁
//     * @param voucherId
//     * @return
//     */
//    public Result  seckillVoucher2(Long voucherId) {
//        //1.查询优惠卷
//        SeckillVoucher s = iSeckillVoucherService.getById(voucherId);
//        //2.判断秒杀是否开始
//        if (s.getBeginTime().isAfter(LocalDateTime.now())) {
//            return Result.fail("秒杀尚未开始");
//        }
//        //3.判断秒杀是否结束
//        if (s.getEndTime().isBefore(LocalDateTime.now())) {
//            return Result.fail("秒杀已经结束");
//        }
//        //4.判断库存是否充足
//        if (s.getStock() <= 0) {
//            return Result.fail("库存不足");
//        }
//        //添加订单：
//        Long userId = UserHolder.getUser().getId();
//        //加redisson锁：
//        RLock lock = redissonClient.getLock("lock:order:"+ userId);
//        boolean b = lock.tryLock();
//        //事务失效，获取IVoucherOrderService的代理对象，才能调用addOder这个方法，更重要的是 事务才能生效
//            IVoucherOrderService p = (IVoucherOrderService)AopContext.currentProxy();
//            return p.addOder(voucherId);
//
//    }
//@Transactional(rollbackFor = Exception.class)
//public  Result  addOder(Long voucherId) {
//        //5.检查是不是抢过了：
//        int count = query().eq("user_id", UserHolder.getUser().getId())
//                .eq("voucher_id", voucherId).count();
//        if (count > 0) {
//            return Result.fail("不能重复下单");
//        }
//        //6.扣减库存  乐观锁？
//        iSeckillVoucherService.update().setSql("stock = stock - 1")
//                .eq("voucher_id", voucherId)
//                .gt("stock",0).update();
//
//        //7.创建订单
//        VoucherOrder voucherOrder = new VoucherOrder();
//         //设置UUID:
//        voucherOrder.setId(Long.valueOf(RandomUtil.randomNumbers(6)));
//        voucherOrder.setUserId(UserHolder.getUser().getId());
//        voucherOrder.setVoucherId(voucherId);
//        //8.插入订单
//        save(voucherOrder);
//        //9.返回订单号
//        return Result.ok(voucherOrder.getId());
//    }
//}
